Beds
beds <- read_csv("raw_data/non_covid_raw_data/beds_by_nhs_board_of_treatment_and_specialty.csv") %>% janitor::clean_names()
Warning: One or more parsing issues, see `problems()` for detailsRows: 30458 Columns: 20── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (10): Quarter, QuarterQF, HB, HBQF, Location, LocationQF, Specialty, SpecialtyQF, SpecialtyName, SpecialtyNameQF
dbl (5): AllStaffedBeddays, TotalOccupiedBeddays, AverageAvailableStaffedBeds, AverageOccupiedBeds, PercentageOccupancy
lgl (5): AllStaffedBeddaysQF, TotalOccupiedBeddaysQF, AverageAvailableStaffedBedsQF, AverageOccupiedBedsQF, PercentageOccupancyQF
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
beds %>%
filter(specialty_name == "All Acute") %>%
ggplot(aes(x = quarter, y = percentage_occupancy))+
geom_line(aes(colour = hb), group = 1)+
facet_wrap(~ hb)

beds <- beds %>%
select(-c(2,4,6,8,10,12,14,16,18,20)) %>%
filter(!hb %in% c("SB0801", "S92000003"))
beds <- beds %>%
filter(!hb %in% c("SB0801", "S92000003")) %>%
filter(hb == location)
# beds %>%
# count(specialty_name)
a_e_beds <- beds %>%
filter(specialty_name == "Accident & Emergency")
# a&e percentage occupancy by hb over time
a_e_beds %>%
group_by(quarter, hb) %>%
summarise(mean_perc_occ = mean(percentage_occupancy, na.rm = TRUE)) %>%
ggplot(aes(x = quarter, y = mean_perc_occ))+
geom_line(aes(group = hb, colour = hb))+
geom_point()+
theme(axis.text.x = element_text(angle = 45))
`summarise()` has grouped output by 'quarter'. You can override using the `.groups` argument.

a_e_beds
#all time bed occupancy percentage for health boards
a_e_beds %>%
group_by(quarter, hb) %>%
summarise(mean_perc_occ = mean(percentage_occupancy, na.rm = TRUE)) %>%
ungroup() %>%
group_by(hb) %>%
summarise(avg_per_occ_all_time = mean(mean_perc_occ)) %>%
arrange(desc(avg_per_occ_all_time)) %>%
ggplot(aes(x = hb, y = avg_per_occ_all_time))+
geom_col()+
geom_point()+
theme(axis.text.x = element_text(angle = 45))
`summarise()` has grouped output by 'quarter'. You can override using the `.groups` argument.

# workout the ten largest
ten_largest_specialities <- beds %>%
group_by(specialty_name) %>%
summarise(mean_avail_staffed_beds = mean(average_available_staffed_beds)) %>%
arrange(desc(mean_avail_staffed_beds)) %>%
slice_max(mean_avail_staffed_beds, n=10) %>%
select(1) %>%
pull()
# bed percentage availablity for top ten largest specialities
beds %>%
filter(specialty_name %in% ten_largest_specialities) %>%
group_by(quarter, specialty_name) %>%
summarise(mean_perc_occ = mean(percentage_occupancy)) %>%
ggplot(aes(x = quarter, y = mean_perc_occ))+
geom_line(aes(colour = specialty_name, group = specialty_name))+
geom_point()+
theme(axis.text.x = element_text(angle = 45, hjust = 1))
`summarise()` has grouped output by 'quarter'. You can override using the `.groups` argument.

# bed percentage availablity for all acute
beds %>%
filter(specialty_name == "All Acute") %>%
group_by(quarter, specialty_name) %>%
summarise(mean_perc_occ = mean(percentage_occupancy)) %>%
ggplot(aes(x = quarter, y = mean_perc_occ))+
geom_line(aes(colour = specialty_name, group = specialty_name))+
geom_point()+
theme(axis.text.x = element_text(angle = 45, hjust = 1))
`summarise()` has grouped output by 'quarter'. You can override using the `.groups` argument.

# bed percentage availability for intensive care
beds %>%
filter(specialty_name == "Intensive Care Medicine") %>%
group_by(quarter, specialty_name) %>%
summarise(mean_perc_occ = mean(percentage_occupancy)) %>%
ggplot(aes(x = quarter, y = mean_perc_occ))+
geom_line(aes(colour = specialty_name, group = specialty_name))+
geom_point()+
theme(axis.text.x = element_text(angle = 45, hjust = 1))
`summarise()` has grouped output by 'quarter'. You can override using the `.groups` argument.

NA
NA
NA
a_e_beds %>%
group_by(quarter) %>%
summarise(mean_available_beds = mean(average_available_staffed_beds, na.rm = TRUE)) %>%
ggplot(aes(x = quarter, y = mean_available_beds))+
geom_line(group ="1")+
geom_point()+
theme(axis.text.x = element_text(angle = 45))

age_sex <- read_csv("raw_data/non_covid_raw_data/inpatient_and_daycase_by_nhs_board_of_treatment_age_and_sex.csv") %>% janitor::clean_names()
Rows: 129393 Columns: 18── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (12): Quarter, QuarterQF, HB, HBQF, Location, LocationQF, AdmissionType, AdmissionTypeQF, Sex, Age, AverageLengthOfEpisodeQF, Aver...
dbl (6): Episodes, LengthOfEpisode, AverageLengthOfEpisode, Stays, LengthOfStay, AverageLengthOfStay
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
health_board_names <- read_csv("raw_data/non_covid_raw_data/health_board_names.csv")
Rows: 18 Columns: 5── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (3): HB, HBName, Country
dbl (2): HBDateEnacted, HBDateArchived
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
age_sex %>%
count(hb)
season_age_sex <- age_sex %>%
mutate(date = yq(quarter),
year = year(date),
month = month(date, label = TRUE, abbr = FALSE),
season = case_when(
str_detect(month, "December") ~ "Winter",
str_detect(month, "January") ~ "Winter",
str_detect(month, "February") ~ "Winter",
str_detect(month, "March") ~ "Spring",
str_detect(month, "April") ~ "Spring",
str_detect(month, "May") ~ "Spring",
str_detect(month, "June") ~ "Summer",
str_detect(month, "July") ~ "Summer",
str_detect(month, "August") ~ "Summer",
str_detect(month, "September") ~ "Autumn",
str_detect(month, "October") ~ "Autumn",
str_detect(month, "November") ~ "Autumn"),
season = factor(season, order = TRUE))
library(lubridate)
library(zoo)
# change quarter column into the date at the start of each quarter
age_sex <- age_sex %>%
mutate(quarter = yq(quarter))
# shows the total length of stay by age bracket for emergency inpatients
age_sex %>%
filter(admission_type == "Emergency Inpatients") %>%
group_by(quarter, age) %>%
summarise(total_length_of_stay = sum(length_of_stay)) %>%
ggplot(aes(x = quarter, y = total_length_of_stay))+
geom_line(aes(colour = age))+
theme(axis.text.x = element_text(angle = 45))
`summarise()` has grouped output by 'quarter'. You can override using the `.groups` argument.

age_sex %>%
count(admission_type)
age_sex
# shows the total length of stay by age bracket for elective inpatients
age_sex %>%
filter(admission_type == "Elective Inpatients") %>%
group_by(quarter, age) %>%
summarise(total_length_of_stay = sum(length_of_stay)) %>%
ggplot(aes(x = quarter, y = total_length_of_stay))+
geom_line(aes(colour = age))+
theme(axis.text.x = element_text(angle = 45))
`summarise()` has grouped output by 'quarter'. You can override using the `.groups` argument.

# shows the mean length of stay by age bracket for emergency inpatients
#can facet by sex also if required
age_sex %>%
filter(admission_type == "Emergency Inpatients") %>%
group_by(quarter, age) %>%
summarise(avg_length_of_stay = mean(average_length_of_stay, na.rm = TRUE)) %>%
ggplot(aes(x = quarter, y = avg_length_of_stay))+
geom_line(aes(colour = age, group = age))+
theme(axis.text.x = element_text(angle = 45))
`summarise()` has grouped output by 'quarter'. You can override using the `.groups` argument.

#facet_wrap( ~ sex)
# shows the mean length of stay by age bracket for elective inpatients
# can facet by sex
# age_sex %>%
# filter(admission_type == "Elective Inpatients") %>%
# group_by(quarter, age) %>%
# summarise(avg_length_of_stay = mean(average_length_of_stay, na.rm = TRUE)) %>%
# ggplot(aes(x = quarter, y = avg_length_of_stay))+
# geom_col(aes(fill = age), position = "dodge")+
# theme(axis.text.x = element_text(angle = 45))+
# scale_x_date(breaks = 4)
# #facet_wrap(~ sex)
library(sf)
scotland <- st_read("../SG_NHS_HealthBoards_2019_shapefile/SG_NHS_HealthBoards_2019.shp")
Reading layer `SG_NHS_HealthBoards_2019' from data source
`C:\Users\neilp\Documents\CODECLAN\phs_scotland_group_project\SG_NHS_HealthBoards_2019_shapefile\SG_NHS_HealthBoards_2019.shp'
using driver `ESRI Shapefile'
Simple feature collection with 14 features and 4 fields
Geometry type: MULTIPOLYGON
Dimension: XY
Bounding box: xmin: 5512.998 ymin: 530250.8 xmax: 470332 ymax: 1220302
Projected CRS: OSGB 1936 / British National Grid
# view(scotland)
#
head(scotland, 3)
Simple feature collection with 3 features and 4 fields
Geometry type: MULTIPOLYGON
Dimension: XY
Bounding box: xmin: 186130 ymin: 530250.8 xmax: 398017.2 ymax: 672679.8
Projected CRS: OSGB 1936 / British National Grid
HBCode HBName Shape_Leng Shape_Area geometry
1 S08000015 Ayrshire and Arran 679782.3 3408802229 MULTIPOLYGON (((201916.2 60...
2 S08000016 Borders 525406.7 4742684960 MULTIPOLYGON (((345325.9 57...
3 S08000017 Dumfries and Galloway 830301.2 6676314851 MULTIPOLYGON (((266004.4 54...
#
plot(scotland[-1])

scotland <- scotland %>%
mutate(centres = st_centroid(st_make_valid(geometry))) %>%
mutate(lat = st_coordinates(centres)[,1],
long = st_coordinates(centres)[,2],
target_2007 = target_2007$ae_target_2007,
target_2018 = target_2018$ae_target_2018,
change_ae = target_2007 - target_2018)
ggplot(data = scotland) +
geom_sf(aes(fill = change_ae)) +
scale_fill_viridis_c(option = "plasma")+
labs(title = "percent change in A&E depts meeting the 4 hour target 2007 - 2018")

ggplot(data = scotland) +
geom_sf(aes(fill = target_2018)) +
scale_fill_viridis_c(option = "plasma")+
labs(title = "Percent of A&E depts making the 4hr target")

ggplot(data = scotland) +
geom_sf(fill = "green")+
ggrepel::geom_text_repel(aes(x = lat , y = long, label = paste(HBCode, HBName, sep = "\n")), min.segment.length = 0.05,size = 3, color = "black", fontface = "bold") +
theme_void()

library(sf)
scotland_smaller <- scotland %>% # make a smaller version for performance issues
st_simplify(TRUE, dTolerance = 2000)
#fixes problems caused by above
scotland_smaller <- sf::st_cast(scotland_smaller, "MULTIPOLYGON")
#
# fig <- ggplotly(
# ggplot(scotland)+
# geom_sf(aes(fill = HBName))
# )
# fig
p <- ggplot(scotland_smaller) +
geom_sf(aes(fill = HBName, text = paste("<b>", HBName, "</b>\n", HBCode)))+
theme_void()
Warning: Ignoring unknown aesthetics: text
p %>%
ggplotly(tooltip = "text") %>%
style(hoverlabel = list(bgcolor = "white"), hoveron = "fill")
NA
NA
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KYGBge3J9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmBgYA0KIyBCZWRzDQpgYGB7cn0NCmJlZHMgPC0gcmVhZF9jc3YoInJhd19kYXRhL25vbl9jb3ZpZF9yYXdfZGF0YS9iZWRzX2J5X25oc19ib2FyZF9vZl90cmVhdG1lbnRfYW5kX3NwZWNpYWx0eS5jc3YiKSAlPiUgamFuaXRvcjo6Y2xlYW5fbmFtZXMoKQ0KYGBgDQoNCmBgYHtyfQ0KYmVkcyAlPiUgDQogIGZpbHRlcihzcGVjaWFsdHlfbmFtZSA9PSAiQWxsIEFjdXRlIikgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBxdWFydGVyLCB5ID0gcGVyY2VudGFnZV9vY2N1cGFuY3kpKSsNCiAgZ2VvbV9saW5lKGFlcyhjb2xvdXIgPSBoYiksIGdyb3VwID0gMSkrDQogIGZhY2V0X3dyYXAofiBoYikNCmBgYA0KDQpgYGB7cn0NCmJlZHMgPC0gYmVkcyAlPiUgDQogIHNlbGVjdCgtYygyLDQsNiw4LDEwLDEyLDE0LDE2LDE4LDIwKSkgJT4lIA0KICBmaWx0ZXIoIWhiICVpbiUgYygiU0IwODAxIiwgIlM5MjAwMDAwMyIpKQ0KDQpiZWRzIDwtIGJlZHMgJT4lIA0KICBmaWx0ZXIoIWhiICVpbiUgYygiU0IwODAxIiwgIlM5MjAwMDAwMyIpKSAlPiUgDQogIGZpbHRlcihoYiA9PSBsb2NhdGlvbikNCiAgDQojIGJlZHMgJT4lIA0KIyBjb3VudChzcGVjaWFsdHlfbmFtZSkNCg0KYV9lX2JlZHMgPC0gYmVkcyAlPiUgDQogIGZpbHRlcihzcGVjaWFsdHlfbmFtZSA9PSAiQWNjaWRlbnQgJiBFbWVyZ2VuY3kiKQ0KYGBgDQoNCmBgYHtyfQ0KIyBhJmUgcGVyY2VudGFnZSBvY2N1cGFuY3kgYnkgaGIgb3ZlciB0aW1lDQphX2VfYmVkcyAlPiUgDQogIGdyb3VwX2J5KHF1YXJ0ZXIsIGhiKSAlPiUgDQogIHN1bW1hcmlzZShtZWFuX3BlcmNfb2NjID0gbWVhbihwZXJjZW50YWdlX29jY3VwYW5jeSwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBxdWFydGVyLCB5ID0gbWVhbl9wZXJjX29jYykpKw0KICBnZW9tX2xpbmUoYWVzKGdyb3VwID0gaGIsIGNvbG91ciA9IGhiKSkrDQogIGdlb21fcG9pbnQoKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSkpDQoNCg0KYV9lX2JlZHMNCmBgYA0KDQpgYGB7cn0NCiNhbGwgdGltZSBiZWQgb2NjdXBhbmN5IHBlcmNlbnRhZ2UgZm9yIGhlYWx0aCBib2FyZHMNCmFfZV9iZWRzICU+JSANCiAgZ3JvdXBfYnkocXVhcnRlciwgaGIpICU+JSANCiAgc3VtbWFyaXNlKG1lYW5fcGVyY19vY2MgPSBtZWFuKHBlcmNlbnRhZ2Vfb2NjdXBhbmN5LCBuYS5ybSA9IFRSVUUpKSAlPiUgDQp1bmdyb3VwKCkgJT4lIA0KICBncm91cF9ieShoYikgJT4lIA0KICBzdW1tYXJpc2UoYXZnX3Blcl9vY2NfYWxsX3RpbWUgPSBtZWFuKG1lYW5fcGVyY19vY2MpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhhdmdfcGVyX29jY19hbGxfdGltZSkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gaGIsIHkgPSBhdmdfcGVyX29jY19hbGxfdGltZSkpKw0KICBnZW9tX2NvbCgpKw0KICBnZW9tX3BvaW50KCkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUpKQ0KDQpgYGANCg0KDQpgYGB7cn0NCiMgd29ya291dCB0aGUgdGVuIGxhcmdlc3QgDQp0ZW5fbGFyZ2VzdF9zcGVjaWFsaXRpZXMgPC0gYmVkcyAlPiUNCiAgZ3JvdXBfYnkoc3BlY2lhbHR5X25hbWUpICU+JSANCiAgc3VtbWFyaXNlKG1lYW5fYXZhaWxfc3RhZmZlZF9iZWRzID0gbWVhbihhdmVyYWdlX2F2YWlsYWJsZV9zdGFmZmVkX2JlZHMpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhtZWFuX2F2YWlsX3N0YWZmZWRfYmVkcykpICU+JSANCiAgc2xpY2VfbWF4KG1lYW5fYXZhaWxfc3RhZmZlZF9iZWRzLCBuPTEwKSAlPiUgDQogIHNlbGVjdCgxKSAlPiUgDQogIHB1bGwoKQ0KDQoNCg0KIyBiZWQgcGVyY2VudGFnZSBhdmFpbGFibGl0eSBmb3IgdG9wIHRlbiBsYXJnZXN0IHNwZWNpYWxpdGllcw0KYmVkcyAlPiUNCiAgZmlsdGVyKHNwZWNpYWx0eV9uYW1lICVpbiUgdGVuX2xhcmdlc3Rfc3BlY2lhbGl0aWVzKSAlPiUgDQogIGdyb3VwX2J5KHF1YXJ0ZXIsIHNwZWNpYWx0eV9uYW1lKSAlPiUNCiAgc3VtbWFyaXNlKG1lYW5fcGVyY19vY2MgPSBtZWFuKHBlcmNlbnRhZ2Vfb2NjdXBhbmN5KSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBxdWFydGVyLCB5ID0gbWVhbl9wZXJjX29jYykpKw0KICBnZW9tX2xpbmUoYWVzKGNvbG91ciA9IHNwZWNpYWx0eV9uYW1lLCBncm91cCA9IHNwZWNpYWx0eV9uYW1lKSkrDQogIGdlb21fcG9pbnQoKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkNCiAgDQojIGJlZCBwZXJjZW50YWdlIGF2YWlsYWJsaXR5IGZvciBhbGwgYWN1dGUNCiAgYmVkcyAlPiUNCiAgZmlsdGVyKHNwZWNpYWx0eV9uYW1lID09ICJBbGwgQWN1dGUiKSAlPiUgDQogIGdyb3VwX2J5KHF1YXJ0ZXIsIHNwZWNpYWx0eV9uYW1lKSAlPiUNCiAgc3VtbWFyaXNlKG1lYW5fcGVyY19vY2MgPSBtZWFuKHBlcmNlbnRhZ2Vfb2NjdXBhbmN5KSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBxdWFydGVyLCB5ID0gbWVhbl9wZXJjX29jYykpKw0KICBnZW9tX2xpbmUoYWVzKGNvbG91ciA9IHNwZWNpYWx0eV9uYW1lLCBncm91cCA9IHNwZWNpYWx0eV9uYW1lKSkrDQogIGdlb21fcG9pbnQoKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkNCiAgDQogICMgYmVkIHBlcmNlbnRhZ2UgYXZhaWxhYmlsaXR5IGZvciBpbnRlbnNpdmUgY2FyZQ0KYmVkcyAlPiUNCiAgZmlsdGVyKHNwZWNpYWx0eV9uYW1lID09ICJJbnRlbnNpdmUgQ2FyZSBNZWRpY2luZSIpICU+JSANCiAgZ3JvdXBfYnkocXVhcnRlciwgc3BlY2lhbHR5X25hbWUpICU+JQ0KICBzdW1tYXJpc2UobWVhbl9wZXJjX29jYyA9IG1lYW4ocGVyY2VudGFnZV9vY2N1cGFuY3kpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IHF1YXJ0ZXIsIHkgPSBtZWFuX3BlcmNfb2NjKSkrDQogIGdlb21fbGluZShhZXMoY29sb3VyID0gc3BlY2lhbHR5X25hbWUsIGdyb3VwID0gc3BlY2lhbHR5X25hbWUpKSsNCiAgZ2VvbV9wb2ludCgpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KICANCiAgDQogIA0KYGBgDQoNCg0KDQpgYGB7cn0NCmFfZV9iZWRzICU+JSANCiAgZ3JvdXBfYnkocXVhcnRlcikgJT4lIA0KICBzdW1tYXJpc2UobWVhbl9hdmFpbGFibGVfYmVkcyA9IG1lYW4oYXZlcmFnZV9hdmFpbGFibGVfc3RhZmZlZF9iZWRzLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IHF1YXJ0ZXIsIHkgPSBtZWFuX2F2YWlsYWJsZV9iZWRzKSkrDQogIGdlb21fbGluZShncm91cCA9IjEiKSsNCiAgZ2VvbV9wb2ludCgpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1KSkNCmBgYA0KDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCmBgYHtyfQ0KYWdlX3NleCA8LSByZWFkX2NzdigicmF3X2RhdGEvbm9uX2NvdmlkX3Jhd19kYXRhL2lucGF0aWVudF9hbmRfZGF5Y2FzZV9ieV9uaHNfYm9hcmRfb2ZfdHJlYXRtZW50X2FnZV9hbmRfc2V4LmNzdiIpICU+JSBqYW5pdG9yOjpjbGVhbl9uYW1lcygpDQoNCmhlYWx0aF9ib2FyZF9uYW1lcyA8LSByZWFkX2NzdigicmF3X2RhdGEvbm9uX2NvdmlkX3Jhd19kYXRhL2hlYWx0aF9ib2FyZF9uYW1lcy5jc3YiKQ0KDQphZ2Vfc2V4ICU+JSANCiAgY291bnQoaGIpDQoNCnNlYXNvbl9hZ2Vfc2V4IDwtIGFnZV9zZXggJT4lIA0KICBtdXRhdGUoZGF0ZSA9IHlxKHF1YXJ0ZXIpLA0KICAgICAgICAgeWVhciA9IHllYXIoZGF0ZSksDQogICAgICAgICBtb250aCA9IG1vbnRoKGRhdGUsIGxhYmVsID0gVFJVRSwgYWJiciA9IEZBTFNFKSwNCiAgICAgICAgIHNlYXNvbiA9IGNhc2Vfd2hlbigNCiAgICAgICAgICAgc3RyX2RldGVjdChtb250aCwgIkRlY2VtYmVyIikgfiAiV2ludGVyIiwNCiAgICAgICAgICAgc3RyX2RldGVjdChtb250aCwgIkphbnVhcnkiKSB+ICJXaW50ZXIiLA0KICAgICAgICAgICBzdHJfZGV0ZWN0KG1vbnRoLCAiRmVicnVhcnkiKSB+ICJXaW50ZXIiLA0KICAgICAgICAgICBzdHJfZGV0ZWN0KG1vbnRoLCAiTWFyY2giKSB+ICJTcHJpbmciLA0KICAgICAgICAgICBzdHJfZGV0ZWN0KG1vbnRoLCAiQXByaWwiKSB+ICJTcHJpbmciLA0KICAgICAgICAgICBzdHJfZGV0ZWN0KG1vbnRoLCAiTWF5IikgfiAiU3ByaW5nIiwNCiAgICAgICAgICAgc3RyX2RldGVjdChtb250aCwgIkp1bmUiKSB+ICJTdW1tZXIiLA0KICAgICAgICAgICBzdHJfZGV0ZWN0KG1vbnRoLCAiSnVseSIpIH4gIlN1bW1lciIsDQogICAgICAgICAgIHN0cl9kZXRlY3QobW9udGgsICJBdWd1c3QiKSB+ICJTdW1tZXIiLA0KICAgICAgICAgICBzdHJfZGV0ZWN0KG1vbnRoLCAiU2VwdGVtYmVyIikgfiAiQXV0dW1uIiwNCiAgICAgICAgICAgc3RyX2RldGVjdChtb250aCwgIk9jdG9iZXIiKSB+ICJBdXR1bW4iLA0KICAgICAgICAgICBzdHJfZGV0ZWN0KG1vbnRoLCAiTm92ZW1iZXIiKSB+ICJBdXR1bW4iKSwNCiAgICAgICAgIHNlYXNvbiA9IGZhY3RvcihzZWFzb24sIG9yZGVyID0gVFJVRSkpIA0KYGBgDQpgYGB7cn0NCg0KbGlicmFyeShsdWJyaWRhdGUpDQpsaWJyYXJ5KHpvbykNCg0KIyBjaGFuZ2UgcXVhcnRlciBjb2x1bW4gaW50byB0aGUgZGF0ZSBhdCB0aGUgc3RhcnQgb2YgZWFjaCBxdWFydGVyDQogYWdlX3NleCA8LSAgYWdlX3NleCAlPiUgDQogICAgbXV0YXRlKHF1YXJ0ZXIgPSB5cShxdWFydGVyKSkNCg0KICMgc2hvd3MgdGhlIHRvdGFsIGxlbmd0aCBvZiBzdGF5IGJ5IGFnZSBicmFja2V0IGZvciBlbWVyZ2VuY3kgaW5wYXRpZW50cw0KYWdlX3NleCAlPiUgDQogIGZpbHRlcihhZG1pc3Npb25fdHlwZSA9PSAiRW1lcmdlbmN5IElucGF0aWVudHMiKSAlPiUgDQogIGdyb3VwX2J5KHF1YXJ0ZXIsIGFnZSkgJT4lIA0KICBzdW1tYXJpc2UodG90YWxfbGVuZ3RoX29mX3N0YXkgPSBzdW0obGVuZ3RoX29mX3N0YXkpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IHF1YXJ0ZXIsIHkgPSB0b3RhbF9sZW5ndGhfb2Zfc3RheSkpKw0KICBnZW9tX2xpbmUoYWVzKGNvbG91ciA9IGFnZSkpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1KSkNCg0KDQpgYGANCg0KDQoNCg0KDQpgYGB7cn0NCmFnZV9zZXggJT4lIA0KY291bnQoYWRtaXNzaW9uX3R5cGUpDQoNCmFnZV9zZXgNCmBgYA0KDQpgYGB7cn0NCiAjIHNob3dzIHRoZSB0b3RhbCBsZW5ndGggb2Ygc3RheSBieSBhZ2UgYnJhY2tldCBmb3IgZWxlY3RpdmUgaW5wYXRpZW50cw0KYWdlX3NleCAlPiUgDQogIGZpbHRlcihhZG1pc3Npb25fdHlwZSA9PSAiRWxlY3RpdmUgSW5wYXRpZW50cyIpICU+JSANCiAgZ3JvdXBfYnkocXVhcnRlciwgYWdlKSAlPiUgDQogIHN1bW1hcmlzZSh0b3RhbF9sZW5ndGhfb2Zfc3RheSA9IHN1bShsZW5ndGhfb2Zfc3RheSkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gcXVhcnRlciwgeSA9IHRvdGFsX2xlbmd0aF9vZl9zdGF5KSkrDQogIGdlb21fbGluZShhZXMoY29sb3VyID0gYWdlKSkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUpKQ0KYGBgDQoNCmBgYHtyfQ0KICMgc2hvd3MgdGhlIG1lYW4gbGVuZ3RoIG9mIHN0YXkgYnkgYWdlIGJyYWNrZXQgZm9yIGVtZXJnZW5jeSBpbnBhdGllbnRzDQojY2FuIGZhY2V0IGJ5IHNleCBhbHNvIGlmIHJlcXVpcmVkDQphZ2Vfc2V4ICU+JSANCiAgZmlsdGVyKGFkbWlzc2lvbl90eXBlID09ICJFbWVyZ2VuY3kgSW5wYXRpZW50cyIpICU+JSANCiAgZ3JvdXBfYnkocXVhcnRlciwgYWdlKSAlPiUgDQogIHN1bW1hcmlzZShhdmdfbGVuZ3RoX29mX3N0YXkgPSBtZWFuKGF2ZXJhZ2VfbGVuZ3RoX29mX3N0YXksIG5hLnJtID0gVFJVRSkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gcXVhcnRlciwgeSA9IGF2Z19sZW5ndGhfb2Zfc3RheSkpKw0KICBnZW9tX2xpbmUoYWVzKGNvbG91ciA9IGFnZSwgZ3JvdXAgPSBhZ2UpKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSkpDQogICNmYWNldF93cmFwKCB+IHNleCkNCg0KICMgc2hvd3MgdGhlIG1lYW4gbGVuZ3RoIG9mIHN0YXkgYnkgYWdlIGJyYWNrZXQgZm9yIGVsZWN0aXZlIGlucGF0aWVudHMNCiMgY2FuIGZhY2V0IGJ5IHNleCANCiMgYWdlX3NleCAlPiUgDQojICAgZmlsdGVyKGFkbWlzc2lvbl90eXBlID09ICJFbGVjdGl2ZSBJbnBhdGllbnRzIikgJT4lIA0KIyAgIGdyb3VwX2J5KHF1YXJ0ZXIsIGFnZSkgJT4lIA0KIyAgIHN1bW1hcmlzZShhdmdfbGVuZ3RoX29mX3N0YXkgPSBtZWFuKGF2ZXJhZ2VfbGVuZ3RoX29mX3N0YXksIG5hLnJtID0gVFJVRSkpICU+JSANCiMgICBnZ3Bsb3QoYWVzKHggPSBxdWFydGVyLCB5ID0gYXZnX2xlbmd0aF9vZl9zdGF5KSkrDQojICAgZ2VvbV9jb2woYWVzKGZpbGwgPSBhZ2UpLCBwb3NpdGlvbiA9ICJkb2RnZSIpKw0KIyAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUpKSsNCiMgICBzY2FsZV94X2RhdGUoYnJlYWtzID0gNCkNCiMgICAjZmFjZXRfd3JhcCh+IHNleCkNCmBgYA0KDQpgYGB7cn0NCmFnZV9zZXggJT4lIA0KICBtdXRhdGUoZGF0ZSA9IHlxKHF1YXJ0ZXIpLA0KICAgICAgICAgeWVhciA9IHllYXIoZGF0ZSksDQogICAgICAgICBtb250aCA9IG1vbnRoKGRhdGUsIGxhYmVsID0gVFJVRSwgYWJiciA9IEZBTFNFKSwNCiAgICAgICAgIHNlYXNvbiA9IGNhc2Vfd2hlbigNCiAgICAgICAgICAgc3RyX2RldGVjdChtb250aCwgIkRlY2VtYmVyIikgfiAiV2ludGVyIiwNCiAgICAgICAgICAgc3RyX2RldGVjdChtb250aCwgIkphbnVhcnkiKSB+ICJXaW50ZXIiLA0KICAgICAgICAgICBzdHJfZGV0ZWN0KG1vbnRoLCAiRmVicnVhcnkiKSB+ICJXaW50ZXIiLA0KICAgICAgICAgICBzdHJfZGV0ZWN0KG1vbnRoLCAiTWFyY2giKSB+ICJTcHJpbmciLA0KICAgICAgICAgICBzdHJfZGV0ZWN0KG1vbnRoLCAiQXByaWwiKSB+ICJTcHJpbmciLA0KICAgICAgICAgICBzdHJfZGV0ZWN0KG1vbnRoLCAiTWF5IikgfiAiU3ByaW5nIiwNCiAgICAgICAgICAgc3RyX2RldGVjdChtb250aCwgIkp1bmUiKSB+ICJTdW1tZXIiLA0KICAgICAgICAgICBzdHJfZGV0ZWN0KG1vbnRoLCAiSnVseSIpIH4gIlN1bW1lciIsDQogICAgICAgICAgIHN0cl9kZXRlY3QobW9udGgsICJBdWd1c3QiKSB+ICJTdW1tZXIiLA0KICAgICAgICAgICBzdHJfZGV0ZWN0KG1vbnRoLCAiU2VwdGVtYmVyIikgfiAiQXV0dW1uIiwNCiAgICAgICAgICAgc3RyX2RldGVjdChtb250aCwgIk9jdG9iZXIiKSB+ICJBdXR1bW4iLA0KICAgICAgICAgICBzdHJfZGV0ZWN0KG1vbnRoLCAiTm92ZW1iZXIiKSB+ICJBdXR1bW4iKSwNCiAgICAgICAgIHNlYXNvbiA9IGZhY3RvcihzZWFzb24sIG9yZGVyID0gVFJVRSkpIA0KYGBgDQoNCg0KYGBge3J9DQoNCmFnZV9zZXggJT4lIA0KICBmaWx0ZXIoYWRtaXNzaW9uX3R5cGUgPT0gIkVtZXJnZW5jeSBJbnBhdGllbnRzIikgJT4lIA0KICBncm91cF9ieShxdWFydGVyLCBzZXgpICU+JSANCiAgc3VtbWFyaXNlKGF2Z19sZW5ndGhfb2Zfc3RheSA9IG1lYW4oYXZlcmFnZV9sZW5ndGhfb2Zfc3RheSwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBxdWFydGVyLCB5ID0gYXZnX2xlbmd0aF9vZl9zdGF5KSkrDQogIGdlb21fbGluZShhZXMoY29sb3VyID0gc2V4LCBncm91cCA9IHNleCkpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1KSkrDQogIGdlb21fc21vb3RoKGFlcyhjb2xvdXIgPSBzZXgsIGdyb3VwID0gc2V4KSwgc2UgPSBGQUxTRSkrDQogIGdlb21fcG9pbnQoYWVzKGNvbG91ciA9IHNleCksIHNpemUgPSAwLjUpKw0KICBsYWJzKHRpdGxlID0gIkVtZXJnZW5jeSBJbnBhdGllbnQgYnkgZ2VuZGVyIGFuZCBhdmVyYWdlIGxlbmd0aCBvZiBzdGF5IikNCg0KDQphZ2Vfc2V4ICU+JSANCiAgZmlsdGVyKGFkbWlzc2lvbl90eXBlID09ICJFbGVjdGl2ZSBJbnBhdGllbnRzIikgJT4lIA0KICBncm91cF9ieShxdWFydGVyLCBzZXgpICU+JSANCiAgc3VtbWFyaXNlKGF2Z19sZW5ndGhfb2Zfc3RheSA9IG1lYW4oYXZlcmFnZV9sZW5ndGhfb2Zfc3RheSwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBxdWFydGVyLCB5ID0gYXZnX2xlbmd0aF9vZl9zdGF5KSkrDQogIGdlb21fbGluZShhZXMoY29sb3VyID0gc2V4LCBncm91cCA9IHNleCkpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1KSkrDQogIGdlb21fc21vb3RoKGFlcyhjb2xvdXIgPSBzZXgsIGdyb3VwID0gc2V4KSwgc2UgPSBGQUxTRSkrDQogIGdlb21fcG9pbnQoYWVzKGNvbG91ciA9IHNleCksIHNpemUgPSAwLjUpKw0KICBsYWJzKHRpdGxlID0gIkVsZWN0aXZlIElucGF0aWVudCBieSBnZW5kZXIgYW5kIGF2ZXJhZ2UgbGVuZ3RoIG9mIHN0YXkiKQ0KDQpgYGANCg0KDQpgYGB7cn0NCiMgZW1lcmdlbmN5IGlucGF0aWVudCBieSBhZ2UgYW5kIGF2ZyBsZW5ndGggb2Ygc3RheQ0KYWdlX3NleCAlPiUgDQogIGZpbHRlcihhZG1pc3Npb25fdHlwZSA9PSAiRW1lcmdlbmN5IElucGF0aWVudHMiKSAlPiUgDQogIGdyb3VwX2J5KHF1YXJ0ZXIsIGFnZSkgJT4lIA0KICBzdW1tYXJpc2UoYXZnX2xlbmd0aF9vZl9zdGF5ID0gbWVhbihhdmVyYWdlX2xlbmd0aF9vZl9zdGF5LCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IHF1YXJ0ZXIsIHkgPSBhdmdfbGVuZ3RoX29mX3N0YXkpKSsNCiAgZ2VvbV9saW5lKGFlcyhjb2xvdXIgPSBhZ2UsIGdyb3VwID0gYWdlKSkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUpKSsNCiAgI2dlb21fc21vb3RoKGFlcyhjb2xvdXIgPSBzZXgsIGdyb3VwID0gc2V4KSwgc2UgPSBGQUxTRSkrDQogIGdlb21fcG9pbnQoYWVzKGNvbG91ciA9IGFnZSksIHNpemUgPSAwLjUpKw0KICBsYWJzKHRpdGxlID0gIkVtZXJnZW5jeSBpbnBhdGllbnQgYnkgYWdlIGFuZCBhdmcgbGVuZ3RoIG9mIHN0YXkiKQ0KDQojIGVsZWN0aXZlIGlucGF0aWVudCBieSBhZ2UgYW5kIGF2ZyBsZW5ndGggb2Ygc3RheQ0KYWdlX3NleCAlPiUgDQogIGZpbHRlcihhZG1pc3Npb25fdHlwZSA9PSAiRWxlY3RpdmUgSW5wYXRpZW50cyIpICU+JSANCiAgZ3JvdXBfYnkocXVhcnRlciwgYWdlKSAlPiUgDQogIHN1bW1hcmlzZShhdmdfbGVuZ3RoX29mX3N0YXkgPSBtZWFuKGF2ZXJhZ2VfbGVuZ3RoX29mX3N0YXksIG5hLnJtID0gVFJVRSkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gcXVhcnRlciwgeSA9IGF2Z19sZW5ndGhfb2Zfc3RheSkpKw0KICBnZW9tX2xpbmUoYWVzKGNvbG91ciA9IGFnZSwgZ3JvdXAgPSBhZ2UpKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSkpKw0KICAjZ2VvbV9zbW9vdGgoYWVzKGNvbG91ciA9IHNleCwgZ3JvdXAgPSBzZXgpLCBzZSA9IEZBTFNFKSsNCiAgZ2VvbV9wb2ludChhZXMoY29sb3VyID0gYWdlKSwgc2l6ZSA9IDAuNSkrDQogIGxhYnModGl0bGUgPSAiRWxlY3RpdmUgaW5wYXRpZW50IGJ5IGFnZSBhbmQgYXZnIGxlbmd0aCBvZiBzdGF5IikNCmBgYA0KYGBge3J9DQojIGVtZXJnZW5jeSBpbnBhdGllbnQgYnkgYWdlIGFuZCBhdmcgZXBpc29kZXMNCmFnZV9zZXggJT4lIA0KICBmaWx0ZXIoYWRtaXNzaW9uX3R5cGUgPT0gIkVtZXJnZW5jeSBJbnBhdGllbnRzIikgJT4lIA0KICBncm91cF9ieShxdWFydGVyLCBhZ2UpICU+JSANCiAgc3VtbWFyaXNlKGF2Z19lcGlzb2RlcyA9IG1lYW4oZXBpc29kZXMsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gcXVhcnRlciwgeSA9IGF2Z19lcGlzb2RlcykpKw0KICBnZW9tX2xpbmUoYWVzKGNvbG91ciA9IGFnZSwgZ3JvdXAgPSBhZ2UpKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSkpKw0KICAjZ2VvbV9zbW9vdGgoYWVzKGNvbG91ciA9IHNleCwgZ3JvdXAgPSBzZXgpLCBzZSA9IEZBTFNFKSsNCiAgZ2VvbV9wb2ludChhZXMoY29sb3VyID0gYWdlKSwgc2l6ZSA9IDAuNSkrDQogIGxhYnModGl0bGUgPSAiRW1lcmdlbmN5IGlucGF0aWVudCBieSBhZ2UgYW5kIGF2ZyBlcGlzb2RlcyIpDQoNCiMgZW1lcmdlbmN5IGlucGF0aWVudCBieSBhZ2UgYW5kIGF2ZyBlcGlzb2Rlcw0KYWdlX3NleCAlPiUgDQogIGZpbHRlcihhZG1pc3Npb25fdHlwZSA9PSAiRWxlY3RpdmUgSW5wYXRpZW50cyIpICU+JSANCiAgZ3JvdXBfYnkocXVhcnRlciwgYWdlKSAlPiUgDQogIHN1bW1hcmlzZShhdmdfZXBpc29kZXMgPSBtZWFuKGVwaXNvZGVzLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IHF1YXJ0ZXIsIHkgPSBhdmdfZXBpc29kZXMpKSsNCiAgZ2VvbV9saW5lKGFlcyhjb2xvdXIgPSBhZ2UsIGdyb3VwID0gYWdlKSkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUpKSsNCiAgI2dlb21fc21vb3RoKGFlcyhjb2xvdXIgPSBzZXgsIGdyb3VwID0gc2V4KSwgc2UgPSBGQUxTRSkrDQogIGdlb21fcG9pbnQoYWVzKGNvbG91ciA9IGFnZSksIHNpemUgPSAwLjUpKw0KICBsYWJzKHRpdGxlID0gIkVtZXJnZW5jeSBpbnBhdGllbnQgYnkgYWdlIGFuZCBhdmcgZXBpc29kZXMiKQ0KYGBgDQoNCg0KDQpgYGB7cn0NCiMgUGxvdCBjb21wYXJpc29uIG9mIEVtZXJnZW5jeSB2cyBFbGVjdGl2ZSBzdWJtaXNzaW9ucw0KYWdlX3NleCAlPiUgDQogIGZpbHRlcihhZG1pc3Npb25fdHlwZSAlaW4lIGMoIkVtZXJnZW5jeSBJbnBhdGllbnRzIiwgIkVsZWN0aXZlIElucGF0aWVudHMiKSkgJT4lIA0KICBncm91cF9ieShxdWFydGVyLCBhZG1pc3Npb25fdHlwZSkgJT4lIA0KICBzdW1tYXJpc2UoYXZnX3N0YXkgPSBtZWFuKGF2ZXJhZ2VfbGVuZ3RoX29mX3N0YXksIG5hLnJtID0gVFJVRSkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gcXVhcnRlciwgeSA9IGF2Z19zdGF5LCBjb2xvdXIgPSBhZG1pc3Npb25fdHlwZSkpKw0KICBnZW9tX2xpbmUoYWVzKGdyb3VwID0gYWRtaXNzaW9uX3R5cGUpKSsNCiAgZ2VvbV9wb2ludCgpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KDQpgYGANCg0KDQpgYGB7cn0NCiMgYXZnX3N0YXkgYnkgYWRtaXNzaW9uIHR5cGUNCmFnZV9zZXggJT4lIA0KICBncm91cF9ieShxdWFydGVyLCBhZG1pc3Npb25fdHlwZSkgJT4lIA0KICBzdW1tYXJpc2UoYXZnX3N0YXkgPSBtZWFuKGF2ZXJhZ2VfbGVuZ3RoX29mX3N0YXksIG5hLnJtID0gVFJVRSkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gcXVhcnRlciwgeSA9IGF2Z19zdGF5LCBjb2xvdXIgPSBhZG1pc3Npb25fdHlwZSkpKw0KICBnZW9tX2xpbmUoYWVzKGdyb3VwID0gYWRtaXNzaW9uX3R5cGUpKSsNCiAgZ2VvbV9wb2ludCgpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KDQoNCiMgYXZnX3N0YXkgZm9yIGFsbCB0eXBlcw0KYWdlX3NleCAlPiUgDQogIGdyb3VwX2J5KHF1YXJ0ZXIpICU+JSANCiAgc3VtbWFyaXNlKGF2Z19zdGF5ID0gbWVhbihhdmVyYWdlX2xlbmd0aF9vZl9zdGF5LCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IHF1YXJ0ZXIsIHkgPSBhdmdfc3RheSwgZ3JvdXAgPSAxKSkrDQogIGdlb21fbGluZShhZXMoZ3JvdXAgPSAxKSkrDQogIGdlb21fcG9pbnQoKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkNCg0KIyBudW1iZXIgb2Ygc3RheXMgZm9yIGFsbCB0eXBlcw0KYWdlX3NleCAlPiUgDQogIGdyb3VwX2J5KHF1YXJ0ZXIpICU+JSANCiAgc3VtbWFyaXNlKHRvdGFsX3N0YXlzID0gc3VtKHN0YXlzLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IHF1YXJ0ZXIsIHkgPSB0b3RhbF9zdGF5cywgZ3JvdXAgPSAxKSkrDQogIGdlb21fbGluZShhZXMoZ3JvdXAgPSAxKSkrDQogIGdlb21fcG9pbnQoKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkNCmBgYA0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCmBgYHtyfQ0Kc2ltZCA8LSByZWFkX2NzdigicmF3X2RhdGEvbm9uX2NvdmlkX3Jhd19kYXRhL2lucGF0aWVudF9hbmRfZGF5Y2FzZV9ieV9uaHNfYm9hcmRfb2ZfdHJlYXRtZW50X2FuZF9zaW1kLmNzdiIpICU+JSBqYW5pdG9yOjpjbGVhbl9uYW1lcygpDQpgYGANCmBgYHtyfQ0KI3RvdGFsIGVwaXNvZGVzKGhvc3BpdGFsaXNhdGlvbnM/KSBieSBzaW1kIHZhbHVlDQpzaW1kICU+JSANCiAgZHJvcF9uYShzaW1kKSAlPiUNCiAgbXV0YXRlKHNpbWQgPSBhcy5mYWN0b3Ioc2ltZCkpICU+JSAjIGdpdmVzIGVhY2ggc2ltZCBhIHNlcGFyYXRlIGNvbG91cg0KICBncm91cF9ieShxdWFydGVyLCBzaW1kKSAlPiUgDQogIHN1bW1hcmlzZSh0b3RhbF9lcGlzb2RlcyA9IHN1bShlcGlzb2RlcywgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBxdWFydGVyLCB5ID0gdG90YWxfZXBpc29kZXMsIGdyb3VwID0gc2ltZCkpKw0KICBnZW9tX2xpbmUoYWVzKGNvbG91ciA9IHNpbWQpKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkrDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OmNvbW1hKQ0KICANCiAgDQpgYGANCg0KDQpgYGB7cn0NCiMgcGxvdCBhdmcgc3RheSBsZW5ndGggZm9yIG1vc3QgYW5kIGxlYXN0IGRlcHJpdmVkIGZvciBlbWVyZ2VuY3kgdW5wYXRpZW50cw0Kc2ltZCAlPiUgDQogIGZpbHRlcihhZG1pc3Npb25fdHlwZSA9PSAiRW1lcmdlbmN5IElucGF0aWVudHMiLCBzaW1kICVpbiUgYygxLDUpKSAlPiUgDQogIGRyb3BfbmEoc2ltZCkgJT4lIA0KICBncm91cF9ieShxdWFydGVyLHNpbWQpICU+JSANCiAgc3VtbWFyaXNlKGF2Z19zdGF5X2xlbmd0aCA9IG1lYW4oYXZlcmFnZV9sZW5ndGhfb2Zfc3RheSwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBxdWFydGVyLCB5ID0gYXZnX3N0YXlfbGVuZ3RoKSkgKw0KICBnZW9tX2xpbmUoYWVzKGNvbG91ciA9IHNpbWQsIGdyb3VwID0gc2ltZCkpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KICANCmBgYA0KDQoNCmBgYHtyfQ0Kc3BlY2lhbGl0eSA8LSByZWFkX2NzdigicmF3X2RhdGEvbm9uX2NvdmlkX3Jhd19kYXRhL2lucGF0aWVudF9hbmRfZGF5Y2FzZV9ieV9uaHNfYm9hcmRfb2ZfdHJlYXRtZW50X2FuZF9zcGVjaWFsdHkuY3N2IikgJT4lIGphbml0b3I6OmNsZWFuX25hbWVzKCkNCmBgYA0KDQpgYGB7cn0NCnNwZWNpYWxpdHkgJT4lIA0KICBjb3VudChhZG1pc3Npb25fdHlwZSkNCg0Kc3BlY2lhbGl0eSAlPiUgDQogIGNvdW50KGhiKQ0KDQpzcGVjaWFsaXR5ICU+JSANCiAgY291bnQobG9jYXRpb24pDQoNCnNwZWNpYWxpdHkgJT4lIA0KICBjb3VudChzcGVjaWFsdHlfbmFtZSkNCg0KIyBhZGQgYXZlcmFnZXMgDQpzcGVjaWFsaXR5X2F2ZXJhZ2VzIDwtIHNwZWNpYWxpdHkgJT4lIA0KICBncm91cF9ieShxdWFydGVyLCBhZG1pc3Npb25fdHlwZSkgJT4lIA0KICBtdXRhdGUoYXZnX2xlbmd0aF9zcGVsbD0gbWVhbihhdmVyYWdlX2xlbmd0aF9vZl9zcGVsbCwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgIGF2Z19sZW5ndGhfZXBpc29kZSA9IG1lYW4oYXZlcmFnZV9sZW5ndGhfb2ZfZXBpc29kZSwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICB1bmdyb3VwKCkNCg0KDQpzcGVjaWFsaXR5X2F2ZXJhZ2VzICU+JSANCiAgZ3JvdXBfYnkocXVhcnRlciwgYWRtaXNzaW9uX3R5cGUpICU+JSANCiAgc2xpY2UoMSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBxdWFydGVyLCB5ID0gYXZlcmFnZV9sZW5ndGhfb2ZfZXBpc29kZSwgZ3JvdXAgPSBhZG1pc3Npb25fdHlwZSkpICsgDQogIGdlb21fbGluZShhZXMoY29sb3VyID0gYWRtaXNzaW9uX3R5cGUpKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkNCg0KYGBgDQoNCmBgYHtyfQ0KYWVfd2FpdF90aW1lcyA8LSByZWFkX2NzdigicmF3X2RhdGEvbm9uX2NvdmlkX3Jhd19kYXRhL21vbnRobHlfYWVfd2FpdGluZ3RpbWVzXzIwMjIwNi5jc3YiKSAlPiUgamFuaXRvcjo6Y2xlYW5fbmFtZXMoKQ0KDQojZ2xpbXBzZShhZV93YWl0X3RpbWVzKQ0KDQoNCiNtYWtlIGEgZGF0ZSBhbmQgeWVhciBjb2x1bW4gd2l0aCB0aGUgZmlyc3QgZGF0ZSBvZiBldmVyeSBtb250aA0KYWVfd2FpdF90aW1lcyA8LSBhZV93YWl0X3RpbWVzICU+JSANCiAgbXV0YXRlKGRhdGUgPSB5bShtb250aCksIC5hZnRlciA9IG1vbnRoLA0KICAgICAgICAgeWVhciA9IHllYXIoZGF0ZSkpDQoNCiNtYWtlIGEgcGVyY2VudCBjb2x1bW4gd2l0aCBwZXJjZW50IG9mIHBhdGllbnRzIG1lZXRpbmcgdGhlIDRociB0YXJnZXQgdGltZQ0KYWVfd2FpdF90aW1lcyA8LSBhZV93YWl0X3RpbWVzICU+JSANCiAgbXV0YXRlKHBlcmNlbnRfNGhyX3RhcmdldF9hY2hpZXZlZCA9IChudW1iZXJfbWVldGluZ190YXJnZXRfYWdncmVnYXRlL251bWJlcl9vZl9hdHRlbmRhbmNlc19hZ2dyZWdhdGUpKjEwMCkgJT4lIA0KICAjYWRkIGFuIDhociBvbmUgLSBub3QgY3VycmVudGx5IHVzZWQNCm11dGF0ZShwZXJjZW50X3NlZW5fd2l0aGluXzhociA9ICgobnVtYmVyX29mX2F0dGVuZGFuY2VzX2FnZ3JlZ2F0ZS1hdHRlbmRhbmNlX2dyZWF0ZXI4aHJzKS9udW1iZXJfb2ZfYXR0ZW5kYW5jZXNfYWdncmVnYXRlKSoxMDApDQpgYGANCg0KDQpgYGB7cn0NCiMgZHJhdyBwZXJjZW50YWdlIG9mIDQgaG91ciB3YWl0IGZvciBhbGwgeWVhcnMNCmZvcl9wbG90bHkgPC0gYWVfd2FpdF90aW1lcyAlPiUgDQogIGZpbHRlcihkZXBhcnRtZW50X3R5cGUgPT0gIkVtZXJnZW5jeSBEZXBhcnRtZW50IikgJT4lIA0KICBncm91cF9ieShkYXRlLCBkZXBhcnRtZW50X3R5cGUpICU+JSANCiAgc3VtbWFyaXNlKGF2Z180aHJfdGFyZ2V0X21hZGUgPSBtZWFuKHBlcmNlbnRfNGhyX3RhcmdldF9hY2hpZXZlZCkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gZGF0ZSwgeSA9IGF2Z180aHJfdGFyZ2V0X21hZGUpKSsNCiAgZ2VvbV9saW5lKGFlcyhjb2xvdXIgPSBkZXBhcnRtZW50X3R5cGUpKSsNCiAgc2NhbGVfeF9kYXRlKGRhdGVfYnJlYWtzID0gIjYgbW9udGhzIiwgZGF0ZV9sYWJlbHMgPSAgIiViICVZIikrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSwgc2l6ZSA9NykpKw0KICBnZW9tX3Ntb290aCgpKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhcy5udW1lcmljKGFzLkRhdGUoIjIwMDgtMDEtMDEiKSksIGxpbmV0eXBlPTQpKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhcy5udW1lcmljKGFzLkRhdGUoIjIwMDktMDEtMDEiKSksIGxpbmV0eXBlPTQpKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhcy5udW1lcmljKGFzLkRhdGUoIjIwMTAtMDEtMDEiKSksIGxpbmV0eXBlPTQpKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhcy5udW1lcmljKGFzLkRhdGUoIjIwMTEtMDEtMDEiKSksIGxpbmV0eXBlPTQpKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhcy5udW1lcmljKGFzLkRhdGUoIjIwMTItMDEtMDEiKSksIGxpbmV0eXBlPTQpKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhcy5udW1lcmljKGFzLkRhdGUoIjIwMTMtMDEtMDEiKSksIGxpbmV0eXBlPTQpKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhcy5udW1lcmljKGFzLkRhdGUoIjIwMTQtMDEtMDEiKSksIGxpbmV0eXBlPTQpKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhcy5udW1lcmljKGFzLkRhdGUoIjIwMTUtMDEtMDEiKSksIGxpbmV0eXBlPTQpKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhcy5udW1lcmljKGFzLkRhdGUoIjIwMTYtMDEtMDEiKSksIGxpbmV0eXBlPTQpKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhcy5udW1lcmljKGFzLkRhdGUoIjIwMTctMDEtMDEiKSksIGxpbmV0eXBlPTQpKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhcy5udW1lcmljKGFzLkRhdGUoIjIwMTgtMDEtMDEiKSksIGxpbmV0eXBlPTQpKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhcy5udW1lcmljKGFzLkRhdGUoIjIwMTktMDEtMDEiKSksIGxpbmV0eXBlPTQpKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhcy5udW1lcmljKGFzLkRhdGUoIjIwMjAtMDEtMDEiKSksIGxpbmV0eXBlPTQpKw0KICBsYWJzKHRpdGxlID0gInBlcmNlbnRhZ2Ugb2YgQSZFIGRlcGFydG1lbnRzIG1lZXRpbmcgdGhlIDQgaHIgdGFyZ2V0IHR1cm5hcm91bmQgZm9yIHBhdGllbnRzIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJhZGRlZCBpbiB2ZXJ0aWNhbCBsaW5lcyBmb3IgSmFudWFyeSB0byBoZWxwIikNCg0KZ2dwbG90bHkoZm9yX3Bsb3RseSkNCmBgYA0KDQpgYGB7cn0NCiMgNGhyIHdhaXQgYnkgaGVhbHRoIGJvYXJkIGZvciBhbGwgeWVhcnMgZmFjZXQgd3JhcHBlZA0KYWVfd2FpdF90aW1lcyAlPiUgDQogIGZpbHRlcihkZXBhcnRtZW50X3R5cGUgPT0gIkVtZXJnZW5jeSBEZXBhcnRtZW50IikgJT4lIA0KICBncm91cF9ieShkYXRlLCBoYnQpICU+JSANCiAgbXV0YXRlKGF2Z180aHJfdGFyZ2V0X21hZGUgPSBtZWFuKHBlcmNlbnRfNGhyX3RhcmdldF9hY2hpZXZlZCkpICU+JSANCiAgc2xpY2UoMSkgJT4lICANCiAgZ2dwbG90KGFlcyh4ID0gZGF0ZSwgeSA9IGF2Z180aHJfdGFyZ2V0X21hZGUpKSsNCiAgZ2VvbV9saW5lKGFlcyhjb2xvdXIgPSBoYnQpKSsNCiAgc2NhbGVfeF9kYXRlKGRhdGVfYnJlYWtzID0gIjYgbW9udGhzIiwgZGF0ZV9sYWJlbHMgPSAgIiViICVZIikrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSwgc2l6ZSA9NykpKw0KICBnZW9tX3Ntb290aCgpKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhcy5udW1lcmljKGFzLkRhdGUoIjIwMDgtMDEtMDEiKSksIGxpbmV0eXBlPTQpKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhcy5udW1lcmljKGFzLkRhdGUoIjIwMDktMDEtMDEiKSksIGxpbmV0eXBlPTQpKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhcy5udW1lcmljKGFzLkRhdGUoIjIwMTAtMDEtMDEiKSksIGxpbmV0eXBlPTQpKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhcy5udW1lcmljKGFzLkRhdGUoIjIwMTEtMDEtMDEiKSksIGxpbmV0eXBlPTQpKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhcy5udW1lcmljKGFzLkRhdGUoIjIwMTItMDEtMDEiKSksIGxpbmV0eXBlPTQpKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhcy5udW1lcmljKGFzLkRhdGUoIjIwMTMtMDEtMDEiKSksIGxpbmV0eXBlPTQpKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhcy5udW1lcmljKGFzLkRhdGUoIjIwMTQtMDEtMDEiKSksIGxpbmV0eXBlPTQpKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhcy5udW1lcmljKGFzLkRhdGUoIjIwMTUtMDEtMDEiKSksIGxpbmV0eXBlPTQpKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhcy5udW1lcmljKGFzLkRhdGUoIjIwMTYtMDEtMDEiKSksIGxpbmV0eXBlPTQpKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhcy5udW1lcmljKGFzLkRhdGUoIjIwMTctMDEtMDEiKSksIGxpbmV0eXBlPTQpKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhcy5udW1lcmljKGFzLkRhdGUoIjIwMTgtMDEtMDEiKSksIGxpbmV0eXBlPTQpKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhcy5udW1lcmljKGFzLkRhdGUoIjIwMTktMDEtMDEiKSksIGxpbmV0eXBlPTQpKw0KICBmYWNldF93cmFwKH4gaGJ0KQ0KYGBgDQoNCmBgYHtyfQ0KdGFyZ2V0XzIwMDcgPC0gYWVfd2FpdF90aW1lcyAlPiUNCiAgZ3JvdXBfYnkoeWVhciwgaGJ0KSAlPiUgDQogIHN1bW1hcmlzZShhZV80aHJfdGFyZ2V0X2FjaGlldmVkID0gbWVhbihwZXJjZW50XzRocl90YXJnZXRfYWNoaWV2ZWQsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgZmlsdGVyKHllYXIgPT0gMjAwNykgJT4lIA0KICByZW5hbWUoYWVfdGFyZ2V0XzIwMDcgPSBhZV80aHJfdGFyZ2V0X2FjaGlldmVkKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIHNlbGVjdChoYnQsYWVfdGFyZ2V0XzIwMDcpDQoNCnRhcmdldF8yMDE4IDwtIGFlX3dhaXRfdGltZXMgJT4lDQogIGdyb3VwX2J5KHllYXIsIGhidCkgJT4lIA0KICBzdW1tYXJpc2UoYWVfNGhyX3RhcmdldF9hY2hpZXZlZCA9IG1lYW4ocGVyY2VudF80aHJfdGFyZ2V0X2FjaGlldmVkLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIGZpbHRlcih5ZWFyID09IDIwMTgpICU+JSANCiAgcmVuYW1lKGFlX3RhcmdldF8yMDE4ID0gYWVfNGhyX3RhcmdldF9hY2hpZXZlZCkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBzZWxlY3QoaGJ0LGFlX3RhcmdldF8yMDE4KQ0KDQpgYGANCg0KDQoNCg0KDQoNCmBgYHtyfQ0KbGlicmFyeShzZikNCg0Kc2NvdGxhbmQgPC0gc3RfcmVhZCgiLi4vU0dfTkhTX0hlYWx0aEJvYXJkc18yMDE5X3NoYXBlZmlsZS9TR19OSFNfSGVhbHRoQm9hcmRzXzIwMTkuc2hwIikNCg0KIyB2aWV3KHNjb3RsYW5kKQ0KIyANCmhlYWQoc2NvdGxhbmQsIDMpDQojIA0KcGxvdChzY290bGFuZFstMV0pDQoNCnNjb3RsYW5kIDwtICBzY290bGFuZCAlPiUgDQogIG11dGF0ZShjZW50cmVzID0gc3RfY2VudHJvaWQoc3RfbWFrZV92YWxpZChnZW9tZXRyeSkpKSAlPiUNCiAgICBtdXRhdGUobGF0ID0gc3RfY29vcmRpbmF0ZXMoY2VudHJlcylbLDFdLA0KICAgICAgICAgICBsb25nID0gc3RfY29vcmRpbmF0ZXMoY2VudHJlcylbLDJdLA0KICAgICAgICAgICB0YXJnZXRfMjAwNyA9IHRhcmdldF8yMDA3JGFlX3RhcmdldF8yMDA3LA0KICAgICAgICAgICB0YXJnZXRfMjAxOCA9IHRhcmdldF8yMDE4JGFlX3RhcmdldF8yMDE4LA0KICAgICAgICAgICBjaGFuZ2VfYWUgPSB0YXJnZXRfMjAwNyAtIHRhcmdldF8yMDE4KQ0KDQpnZ3Bsb3QoZGF0YSA9IHNjb3RsYW5kKSArDQogICAgZ2VvbV9zZihhZXMoZmlsbCA9IGNoYW5nZV9hZSkpICsNCiAgICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhvcHRpb24gPSAicGxhc21hIikrDQogIGxhYnModGl0bGUgPSAicGVyY2VudCBjaGFuZ2UgaW4gQSZFIGRlcHRzIG1lZXRpbmcgdGhlIDQgaG91ciB0YXJnZXQgMjAwNyAtIDIwMTgiKQ0KICANCg0KZ2dwbG90KGRhdGEgPSBzY290bGFuZCkgKw0KICAgIGdlb21fc2YoYWVzKGZpbGwgPSB0YXJnZXRfMjAxOCkpICsNCiAgICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhvcHRpb24gPSAicGxhc21hIikrDQogIGxhYnModGl0bGUgPSAiUGVyY2VudCBvZiBBJkUgZGVwdHMgbWFraW5nIHRoZSA0aHIgdGFyZ2V0IikNCmBgYA0KDQoNCmBgYHtyfQ0KZ2dwbG90KGRhdGEgPSBzY290bGFuZCkgKw0KZ2VvbV9zZihmaWxsID0gImdyZWVuIikrDQpnZ3JlcGVsOjpnZW9tX3RleHRfcmVwZWwoYWVzKHggPSBsYXQgLCB5ID0gbG9uZywgbGFiZWwgPSBwYXN0ZShIQkNvZGUsIEhCTmFtZSwgc2VwID0gIlxuIikpLCBtaW4uc2VnbWVudC5sZW5ndGggPSAwLjA1LHNpemUgPSAzLCBjb2xvciA9ICJibGFjayIsIGZvbnRmYWNlID0gImJvbGQiKSArDQogIHRoZW1lX3ZvaWQoKQ0KYGBgDQoNCg0KYGBge3J9DQoNCmxpYnJhcnkoc2YpDQoNCnNjb3RsYW5kX3NtYWxsZXIgPC0gc2NvdGxhbmQgJT4lICMgbWFrZSBhIHNtYWxsZXIgdmVyc2lvbiBmb3IgcGVyZm9ybWFuY2UgaXNzdWVzDQogIHN0X3NpbXBsaWZ5KFRSVUUsIGRUb2xlcmFuY2UgPSAyMDAwKQ0KI2ZpeGVzIHByb2JsZW1zIGNhdXNlZCBieSBhYm92ZSANCnNjb3RsYW5kX3NtYWxsZXIgPC0gc2Y6OnN0X2Nhc3Qoc2NvdGxhbmRfc21hbGxlciwgIk1VTFRJUE9MWUdPTiIpDQoNCg0KIyANCiMgICBmaWcgPC0gZ2dwbG90bHkoDQojICAgICBnZ3Bsb3Qoc2NvdGxhbmQpKw0KIyAgIGdlb21fc2YoYWVzKGZpbGwgPSBIQk5hbWUpKQ0KIyApDQojICAgZmlnDQoNCiAgDQogIHAgPC0gZ2dwbG90KHNjb3RsYW5kX3NtYWxsZXIpICsgDQogIGdlb21fc2YoYWVzKGZpbGwgPSBIQk5hbWUsIHRleHQgPSBwYXN0ZSgiPGI+IiwgSEJOYW1lLCAiPC9iPlxuIiwgSEJDb2RlKSkpKw0KICAgIHRoZW1lX3ZvaWQoKQ0KICBwICU+JQ0KICBnZ3Bsb3RseSh0b29sdGlwID0gInRleHQiKSAlPiUNCiAgc3R5bGUoaG92ZXJsYWJlbCA9IGxpc3QoYmdjb2xvciA9ICJ3aGl0ZSIpLCBob3Zlcm9uID0gImZpbGwiKQ0KICAgIA0KICANCmBgYA0KDQpgYGB7cn0NCmNvdmlkX2FnZV9zZXggPC0gcmVhZF9jc3YoInJhd19kYXRhL2NvdmlkX3Jhd19kYXRhL2hvc3BpdGFsX2FkbWlzc2lvbnNfaGJfYWdlc2V4XzIwMjIwMzAyLmNzdiIpDQoNCmhlYWQoY292aWRfYWdlX3NleCkNCmBgYA0KDQo=